<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Iterator和for...of循环</title>
</head>
<body>
  <script>
    /**
     * javascript原有表示“集合”的数据结构，主要是数组和对象，es6又天际案例Map和Set，这样就有了四种数据集合
     * 用户还可以组合使用他们，比如数组对象嵌套这种，这样就需要一种统一的接口机制，来处理所有不同的数据结构
     *
     * 遍历器(Iterator)就是这样一种机制，它是一种接口，为各种不同的数据结构提供统一的访问机制，任何数据结构
     * 只要部署了Iterator接口，就可以完成遍历操作。
     *
     * Iterator的作用有三个：一是为各种数据结构提供一个统一的、简洁的访问接口；二是使得数据结构的成员能够按某种次序排列
     * 三是：es6创造了一种新的遍历命令 for...of循环，Iterator接口主要供for...of消费
     *
     * Iterator其遍历过程是：
     *
     * 1. 创建一个指针对象，指向当前数据结构的起始位置。 也就是说，遍历器对象本质上就是一个指针对象。
     * 2. 第一次调用指针对象的next方法，可以将指针对象指向数据结构的第一个成员。
     * 3. 第二次调用指针对象的next方法，指针就指向数据结构的第二个成员。
     * 4. 不断调用指针对象的next方法，直到它指向数据结构的结束位置。
     *
     * 每一次调用next方法，都会返回数据结构的当前成员的信息，具体来说就是返回一个包含value和done俩个属性的对象。
     * 其中value属性是当前成员的值，done属性是一个布尔值，表示遍历是否结束
    */
   // 下面是一个模拟next方法返回值的例子
   function makeIterator (array) {
     var nextIndex = 0;
     return {
       next: function () {
         return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true}
       }
     }
   }
   var it = makeIterator(['a', 'b']);
   console.log(it.next()) // {value: 'a', done: false}
   console.log(it.next()) // {value: 'b', done: false}
   console.log(it.next()) // {value: undefined, done: true}
  </script>
</body>
</html>